/*
两数相加

给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
*/

#include <iostream>

using namespace std;

struct ListNode
{
    int val;
    ListNode *next;

    ListNode() : val(0), next(nullptr) {}
    ListNode(int val) : val(val), next(nullptr) {}
    ListNode(int val, ListNode *next) : val(val), next(next) {}
};

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
    ListNode *dummy = new ListNode;
    ListNode *head = dummy;

    int indeed = 0;
    while (l1 != nullptr || l2 != nullptr)
    {
        int a = l1 == nullptr ? 0 : l1->val;
        int b = l2 == nullptr ? 0 : l2->val;

        int sum = a + b + indeed;
        indeed = sum / 10;

        head->next = new ListNode(sum % 10);
        head = head->next;

        if (l1 != nullptr) l1 = l1->next;
        if (l2 != nullptr) l2 = l2->next;
    }

    if (indeed)
    {
        head->next = new ListNode(1);
    }

    return dummy->next;
}

void printList(ListNode *l)
{
    while (l != nullptr)
    {
        cout << l->val << endl;
        l = l->next;
    }
}

int main()
{
    ListNode *l1 = new ListNode(2);
    l1->next = new ListNode(4);
    l1->next->next = new ListNode(5);

    printList(l1);

    ListNode *l2 = new ListNode(5);
    l2->next = new ListNode(6);
    l2->next->next = new ListNode(4);

    printList(l2);

    ListNode *res = addTwoNumbers(l1, l2);
    printList(res);

    return 0;
}